<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0059)http://203.162.17.98/weblh/suutam/2002/vovisoft/msnet/9.htm -->
<HTML><HEAD><TITLE>Bài 9</TITLE>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<META content="Le Hoan" name=Author>
<META content="MSHTML 5.50.4134.100" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId>
<META 
content="computer, software, games, vietnam, viet nam, tin hoc, le hoan, pclehoan, ktlehoan, vietnamese, download, saigon, freeware, lehoanpc, mailing list, may tinh, phan cung, phan mem, kien thuc, hop thu, internet, weblh, unicode, Forum, chat, diendan, dien dan" 
name=keywords>
<META 
content="Pho bien kien thuc, huong dan su dung phan cung, phan mem may tinh, game. Download software free. Link website Vietnam, forum, chat, mailing list..." 
name=description></HEAD>
<BODY>
<CENTER>
<P><A href="http://www.vovisoft.com/"><IMG height=77 alt="Logo of Vovisoft" 
src="9_files/vs-logo4_10.gif" width=102 border=0> </A><FONT face=Tahoma></P>
<H2><FONT face=Tahoma color=#800000>Bài 9</FONT></H2>
<H2><FONT face=Tahoma color=#800000>Những chức năng mới trong giao diện cửa sổ 
của VB.NET (phần II)</FONT></H2></CENTER></FONT><FONT face=Arial>
<BLOCKQUOTE>
  <BLOCKQUOTE>
    <H3><FONT color=green size=2>Sự khác biệt trong các Hộp Giao Thoại (Dialog 
    Boxes)</FONT></H3>
    <P><FONT size=2>Trong VB6, các hộp giao thoại thật ra là những form bình 
    thường nhưng được hiển thị với parameter vbModal, tức là trong Modal mode. 
    Điều nầy khíến cho hộp giao thoại trở nên form tích cực (active form) duy 
    nhất trong chương trình cho đến khi nó đi khuất.<BR><BR>Một hộp giao thoại 
    cần một phương tiện để liên lạc với form gọi nó (calling form). Trong VB6, 
    ta giải quyết vấn đề nầy bằng cách chế ra một property tạm gọi là 
    <B>Action</B>. Ta dùng <B>Read-only property Action</B> như sau trong một 
    hộp giao thoại có hai buttons, <B>OK</B> và 
    <B>Cancel</B>:<BR><BR></FONT></P></FONT><FONT face=Tahoma>
    <BLOCKQUOTE>
      <TABLE bgColor=#f6f6f6>
        <TBODY>
        <TR>
          <TD><FONT size=3><PRE><FONT face=Arial><FONT color=green>' VB6 code used for Dialog Boxes</FONT>
<FONT color=blue>Public</FONT> <FONT color=blue>Enum</FONT> dialogAction 
   actionOK = 1 
   actionCancel = 2 
<FONT color=blue>End</FONT> <FONT color=blue>Enum</FONT> 

<FONT color=blue>Dim</FONT> mAction <FONT color=blue>As</FONT> dialogAction 

<FONT color=blue>Public</FONT> <FONT color=blue>Property</FONT> <FONT color=blue>Get</FONT> Action() <FONT color=blue>As</FONT> dialogAction 
   Action = mAction 
<FONT color=blue>End</FONT> <FONT color=blue>Property</FONT> 

<FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> cmdOK_Click() 
   <FONT color=green>' Get here when user click the OK button</FONT>
   mAction = actionOK 
   <FONT color=green>' Hide the Dialog Box to return control to calling form</FONT>
   Me.Hide 
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 

<FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> cmdCancel_Click() 
   <FONT color=green>' Get here when user click the Cancel button</FONT>
   mAction = actionCancel 
   <FONT color=green>' Hide the Dialog Box to return control to calling form</FONT>
   Me.Hide 
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE><FONT face=Arial 
    size=2>
    <P>Chú ý ta dùng Enumerated type <B>dialogAction</B>. Nó có hai trị số: 
    <B>actionOK</B> và <B>actionCancel</B>. Property Action thuộc loại 
    enumerated type nầy. Khi user click một button, ta set trị số cho local 
    variable <B>mAction</B> rồi <B>Hide</B> cái dialog box. Cái Giao thoại phải 
    được dấu đi (hidden) nhưng không unloaded, vì cái calling form còn phải truy 
    cập dialog box để đọc trị số của property Action để biết user vừa mới click 
    button nào.<BR><BR>Giả dụ ta đặt tên cho hộp giao thoại đó là 
    <B>frmDialog</B>. Để gọi một hộp giao thoại từ một form khác trong VB6 ta có 
    thể code như sau:<BR><BR></P></FONT>
    <BLOCKQUOTE>
      <TABLE bgColor=#f6f6f6>
        <TBODY>
        <TR>
          <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> Dialog <FONT color=blue>As</FONT> frmDialog 
<FONT color=blue>Set</FONT> Dialog = <FONT color=blue>New</FONT> frmDialog  <FONT color=green>' Instantiate a Dialog Box</FONT>
<FONT color=green>' Show dialog box in Modal mode</FONT>
Dialog.Show vbModal 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE><FONT face=Arial 
    size=2>
    <P>Nhưng bao nhiêu đó chỉ là hiển thị hộp giao thoại thôi. Sau khi hộp giao 
    thoại đã Hide rồi ta còn phải truy cập nó để đọc trị số của property Action. 
    Do đó ta cần phải viết thêm codes cho đầy đủ sau đây:<BR><BR></P></FONT>
    <BLOCKQUOTE>
      <TABLE bgColor=#f6f6f6>
        <TBODY>
        <TR>
          <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> Dialog <FONT color=blue>As</FONT> frmDialog 
<FONT color=blue>Set</FONT> Dialog = <FONT color=blue>New</FONT> frmDialog  <FONT color=green>' Instantiate a Dialog Box</FONT>
<FONT color=green>' Show dialog box in Modal mode</FONT>
Dialog.Show vbModal 
<FONT color=green>' Get here after the dialog box has hidden, but still loaded</FONT>
<FONT color=green>' Now process the Action</FONT>
<FONT color=blue>Select</FONT> <FONT color=blue>Case</FONT> Dialog.Action 
<FONT color=blue>Case</FONT> actionOK 
   <FONT color=green>' code goes here for normal processing</FONT>
<FONT color=blue>Case</FONT> actionCancel 
   <FONT color=green>' code goes here for user canceling</FONT>
<FONT color=blue>End</FONT> <FONT color=blue>Select</FONT> 
Unload Dialog  <FONT color=green>' Now we can unload the dialog box</FONT>
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE><FONT face=Arial>
    <P><FONT size=2>Có hai sự thay đổi quan trọng trong VB.NET, đó là dùng 
    <B>ShowDialog</B> và <B>DialogResult</B>. </FONT></P>
    <H3><FONT color=blue size=2>ShowDialog thay vì Show vbModal</FONT></H3>
    <P><FONT size=2>Argument vbModal không được hỗ trợ trong VB.NET. Thay vào 
    đó, một form có thể dùng method <B>ShowDialog</B>. Dưới đây là sự so sánh 
    của coding trong VB6 và VB.NET.<BR><BR>VB6 code:<BR><BR></FONT></P></FONT>
    <BLOCKQUOTE>
      <TABLE bgColor=#f6f6f6>
        <TBODY>
        <TR>
          <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> Dialog <FONT color=blue>As</FONT> frmDialog 
<FONT color=blue>Set</FONT> Dialog = <FONT color=blue>New</FONT> frmDialog  <FONT color=green>' Instantiate a Dialog Box</FONT>
<FONT color=green>' Show dialog box in Modal mode</FONT>
Dialog.Show vbModal 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE><FONT face=Arial 
    size=2>
    <P>VB.NET code:<BR><BR></P></FONT>
    <BLOCKQUOTE>
      <TABLE bgColor=#f6f6f6>
        <TBODY>
        <TR>
          <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> Dialog <FONT color=blue>As</FONT> <FONT color=blue>New</FONT> frmDialog() 
<FONT color=green>' Show dialog box in Modal mode</FONT>
Dialog.ShowDialog 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE><FONT face=Arial>
    <P><FONT size=2>Để ý là trong VB.NET ở hàng code đầu ta có thể kết hợp hai 
    chuyện khai báo và instantiate form mới trong một statement. Hàng code cuối 
    cho thấy sự thay đổi từ Show vbModal qua ShowDialog. </FONT></P>
    <H3><FONT color=blue size=2>DialogResult</FONT></H3>
    <P><FONT size=2>Trong VB.NET, khi một form khải thị bằng method ShowDialog, 
    nó đã dự bị sẵn một property tên là <B>DialogResult</B> để calling form có 
    thể truy cập. <BR><BR>DialogResult có thể mang một trong những trị số 
    enumerated sau đây:<BR><BR></FONT></P>
    <UL>
      <LI><FONT size=2>DialogResult.Abort </FONT>
      <LI><FONT size=2>DialogResult.Cancel </FONT>
      <LI><FONT size=2>DialogResult.Ignore </FONT>
      <LI><FONT size=2>DialogResult.No </FONT>
      <LI><FONT size=2>DialogResult.None </FONT>
      <LI><FONT size=2>DialogResult.OK </FONT>
      <LI><FONT size=2>DialogResult.Retry </FONT>
      <LI><FONT size=2>DialogResult.Yes </FONT></LI></UL>
    <P><FONT size=2>Có điểm rất tiện là khi DialogResult được set cho một trị số 
    thì dialog được dấu đi (hidden) một cách tự động.<BR><BR>Cách đơn giản nhất 
    để set trị số cho DialogResult là assign một trị số cho <B>property 
    DialogResult</B> của một <B>button</B>. Khi user click button ấy thì 
    DialogResult của hộp giao thoại lấy trị số của property DialogResult của 
    button và hộp giao thoại Hide. </FONT></P>
    <BLOCKQUOTE>
      <P><FONT size=2><IMG height=423 src="9_files/DialogResult.gif" 
      width=356></FONT></P></BLOCKQUOTE>
    <P><FONT size=2>Để biểu diễn ShowDialog trong VB.NET, kèm theo đây là <A 
    href="http://www.vovisoft.com/dotNET/Bai09/ShowDialog.zip">mã nguồn của một 
    thí dụ</A>. Trong thí dụ nầy ta tạo một form tên frmDialog có hai button tên 
    OK và Cancel. Ta set property DialogResult của button OK thành <B>OK</B> và 
    property DialogResult của button Cancel thành <B>Cancel</B>. Form frmDialog 
    hoàn toàn không có một hàng code nào cả.<BR><BR>Form chính của chương trình, 
    Form1, chỉ có một button tên <B>BtnShowDialog</B> với code cho Event Click 
    như dưới đây:<BR><BR></FONT></P></FONT>
    <BLOCKQUOTE>
      <TABLE bgColor=#f6f6f6>
        <TBODY>
        <TR>
          <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> BtnShowDialog_Click( <FONT color=blue>ByVal</FONT> sender <FONT color=blue>As</FONT> System.Object, <FONT color=blue>ByVal</FONT> e <FONT color=blue>As</FONT> System.EventArgs) <FONT color=blue>Handles</FONT> BtnShowDialog.Click 
  <FONT color=green>' Declare and instantiate a Dialog Box</FONT>
   <FONT color=blue>Dim</FONT> Dialog <FONT color=blue>As</FONT> <FONT color=blue>New</FONT> frmDialog() 
  <FONT color=green>' Show the Dialog Box in Modal mode</FONT>
   Dialog.ShowDialog() 
  <FONT color=green>' get here after user has clicked a button and the Dialog box has hidden</FONT>
  <FONT color=green>' Process the DialogResult</FONT>
   <FONT color=blue>Select</FONT> <FONT color=blue>Case</FONT> Dialog.DialogResult 
   <FONT color=blue>Case</FONT> DialogResult.OK 
      MsgBox("User clicked OK, se please go ahead") 
   <FONT color=blue>Case</FONT> DialogResult.Cancel 
      MsgBox("Sorry, but User clicked Cancel") 
   <FONT color=blue>End</FONT> <FONT color=blue>Select</FONT> 
   Dialog = <FONT color=blue>Nothing</FONT> <FONT color=green>' Dispose the Dialog Box</FONT>
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE><FONT face=Arial 
    size=2>
    <P>Bạn có thể chạy chương trình rồi click button ShowDialog. Khi Dialog box 
    hiển thị, thử click một trong hai buttons trên ấy.<BR><BR>So sánh với VB6, 
    ta thấy dùng Dialog Box trong VB.NET đơn giản và tự nhiên hơn.<BR><BR>Nếu 
    không dùng Property DialogResult của một button trong Dialog Box để trả về 
    kết quả DialogResult, ta cũng có thể dùng code trong Dialog form như 
    sau:<BR><BR></P></FONT>
    <BLOCKQUOTE>
      <TABLE bgColor=#f6f6f6>
        <TBODY>
        <TR>
          <TD><FONT size=3><PRE><FONT face=Arial>  Me.DialogResult = DialogResult.Retry 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE><FONT face=Arial>
    <P><FONT size=2>Hàng code trên set DialogResult của Dialog form thành 
    DialogResult.Retry và kềm theo phản ứng phụ là Hide Dialog Box. Calling form 
    sẽ truy cập được kết quả DialogResult.Retry nầy. </FONT></P>
    <H3><FONT color=green size=2>Sự khác biệt về sắp đặt vị trí cho Forms và 
    Controls</FONT></H3>
    <P><FONT size=2>VB.NET có những chức năng về positioning và layout tương tợ 
    như trong VB6, nhưng cách thực thi hơi khác. </FONT></P>
    <H3><FONT color=blue size=2>Property Location</FONT></H3>
    <P><FONT size=2>Thay vào các properties <B>Left</B> và <B>Top</B> trong VB6, 
    forms và controls trong VB.NET có property <B>Location</B>. Property 
    Location nhận và trả về một structure tên <B>Point</B>, có tọa độ <B>X</B> 
    và <B>Y</B> tương ứng với Left và Top mà ta dùng trước đây. 
    <BR><BR>Structure point được dùng trong nhiều áp dụng về đồ họa trong 
    <B>GDI+ (Graphic Devices Interface plus)</B> của .NET.<BR><BR>Thật ra, trong 
    code ta vẫn còn dùng Top và Left được như xưa. Nhưng Top và Left không hiện 
    ra trong cửa sổ Properties của forms hay controls. Để chỉ định một vị trí 
    mới cho form, ta có thể code như sau:<BR><BR></FONT></P></FONT>
    <BLOCKQUOTE>
      <TABLE bgColor=#f6f6f6>
        <TBODY>
        <TR>
          <TD><FONT size=3><PRE><FONT face=Arial>    Me.Location = (New Point(200, 100)) 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE><FONT face=Arial>
    <H3><FONT color=blue size=2>Property Size</FONT></H3>
    <P><FONT size=2>Property Size trong VB.NET có cùng một ý niệm như property 
    <B>Location</B>, có điều nó tương xứng với Width và Height. Property Size 
    nhận và trả về một structure tên <B>Size</B>, có chiều cao và chiều rộng để 
    áp dụng cùng một lúc thay vì tuần tự từng chiều. Giống như Left và Top, 
    trong code ta vẫn còn dùng Width và Height được như xưa. Nhưng Width và 
    Height không hiện ra trong cửa sổ Properties của forms hay controls. Để thay 
    đổi Size của một form, ta có thể code như sau:<BR><BR></FONT></P></FONT>
    <BLOCKQUOTE>
      <TABLE bgColor=#f6f6f6>
        <TBODY>
        <TR>
          <TD><FONT size=3><PRE><FONT face=Arial>    Me.Size = (New Size(300, 400)) 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE><FONT face=Arial>
    <H3><FONT color=blue size=2>ReSize nhiều controls</FONT></H3>
    <P><FONT size=2>VS.NET cho ta một chức năng mới là Resize nhiều controls 
    cùng một lúc. Trước hết bạn Select nhiều controls bằng cách drag một dây 
    thun (rubber band) bao quanh chúng hay ấn nút <B>Ctrl</B> trong lúc click 
    các controls. Kế đó, tập trung việc resize vào một control, các controls kia 
    cũng được resized theo. </FONT></P>
    <H3><FONT color=green size=2>Các features thiết kế chung cho các 
    Controls</FONT></H3>
    <H3><FONT color=blue size=2>Tab Order của các Controls</FONT></H3>
    <P><FONT size=2>Sắp đặt thứ tự trong Tab của các controls (<B>Tab Order</B>) 
    trên một form đôi khi rất phiền phức trong VB6. VS.NET cho ta một feature 
    rất tiện dụng để làm việc nầy. Để khởi động feature ấy, ta dùng IDE menu 
    command <B>View | Tab Order</B>. Nó sẽ hiển thị một con số nhỏ ở góc trên 
    trái của mỗi control, cho thấy trị số <B>Tab Index</B> của mỗi control. Bây 
    giờ ta chỉ cần click lên từng control một theo thứ tự mà ta 
    muốn.<BR><BR>Dưới đây là screenshot của một form sau khi user chỉ định Tab 
    Order cho các controls. Muốn ra khỏi Tab Order mode, ta bấm menu command 
    <B>View | Tab Order</B> một lần nữa.<BR><BR></FONT></P>
    <BLOCKQUOTE>
      <P><FONT size=2><IMG height=201 src="9_files/TabOrder.gif" 
      width=375></FONT></P></BLOCKQUOTE>
    <P><B><FONT size=2>Ghi chú:</FONT></B><FONT size=2>Trong VB.NET nhiều 
    controls có thể có cùng một Tab Index. Trong trường hợp ấy, thứ tự về Tab 
    của chúng được quyết định dựa vào <B>z-order</B>. Control có z-order cao 
    nhất sẽ nhận focus trước nhất trong nhóm. Z-order của một control có thể 
    được thay đổi bằng cách right click control rồi chọn <B>Bring to Front</B>. 
    </FONT></P>
    <H3><FONT color=blue size=2>Control Arrays</FONT></H3>
    <P><FONT size=2>Khi nghe nói VB.NET không hỗ trợ Control Arrays chắc bạn 
    buồn năm phút. Có hai lý do tại sao bạn cần Control Arrays:<BR></FONT></P>
    <OL>
      <LI><FONT size=2>Dùng cùng một Event handler (thí dụ như Sub 
      BtnBrowse_Click) để xử lý Event từ nhiều Controls tương tự. </FONT>
      <LI><FONT size=2>Để dynamically tạo thêm Controls trong form lúc đang chạy 
      program (at runtime). </FONT></LI></OL>
    <P><FONT size=2>May thay, VB.NET cung cấp cho ta một phương tiện khác để 
    khỏi phải thua thiệt. VB.NET cho phép ta linh động bổ nhiệm các methods để 
    xử lý Events của các controls. Điểm thứ nhất bạn sẽ chú ý là bạn không thể 
    dùng cùng một tên cho nhiều controls nữa. <B>Property Index</B> đã bị khai 
    tử.<BR><BR>Trong VB.NET bạn có thể dùng một Event handler duy nhất để xử lý 
    Events đến từ các controls tương tự. Trước đây ta dựa vào <B>Index</B> để 
    biết Event phát xuất từ control nào. Bây giờ bạn dựa vào <B>parameter 
    Sender</B>. <BR><BR>Để minh họa điểm nầy, ta sẽ viết một chương trình có hai 
    buttons, Button1 và Button2, nằm trên form chính. Double click Button1 để 
    viết code xử lý <B>Event Button1.Click</B>. Muốn dùng cùng một Event Sub nầy 
    để xử lý luôn Event Click đến từ Button2, bạn chỉ cần thêm chữ 
    <B>Button2.Click</B> vào cuối cái <B>Handles List</B> của <B>Sub 
    Button1_Click</B>. Để cho có vẻ tổng quát ta rename Sub Button1_Click thành 
    <B>Sub Button_Click</B>.<BR><BR>Bây giờ ta viết vài dòng code đơn giản để 
    hiển thị cho biết Event Click đến từ Button nào:<BR><BR></FONT></P></FONT>
    <BLOCKQUOTE>
      <TABLE bgColor=#f6f6f6>
        <TBODY>
        <TR>
          <TD><FONT size=3><PRE><FONT face=Arial><FONT color=green>' Note that we change the name of the Sub from Button1_Click to Button_Click to</FONT>
<FONT color=green>' make it more general, since we're going to use this same Sub to handle Click</FONT>
<FONT color=green>' Events originated from many different Buttons</FONT>
<FONT color=green>' Also note that we add the word Button2.Click to the end of Sub Button_Click declaration</FONT>
<FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> Button_Click( <FONT color=blue>ByVal</FONT> sender <FONT color=blue>As</FONT> System.Object, <FONT color=blue>ByVal</FONT> e <FONT color=blue>As</FONT> System.EventArgs)  _
                      <FONT color=blue>Handles</FONT> Button1.Click, Button2.Click 
   <FONT color=blue>Dim</FONT> btnClicked <FONT color=blue>As</FONT> Button 
  <FONT color=green>' Type cast sender to Button</FONT>
   btnClicked =  CType(sender, Button) 
  <FONT color=green>' Show what button was clicked</FONT>
   MessageBox.Show("You clicked """ &amp; btnClicked.Text &amp; """") 
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE><FONT face=Arial>
    <P><FONT size=2>Thử chạy chương trình và click Button2, bạn sẽ thấy hình 
    dưới đây:<BR><BR></FONT></P>
    <BLOCKQUOTE>
      <P><FONT size=2><IMG height=231 src="9_files/ControlArrays.gif" 
      width=375></FONT></P></BLOCKQUOTE>
    <P><FONT size=2>Để biểu diễn chức năng quản lý Event Handling at runtime, ta 
    sẽ đặt một button tên <B>BtnAddNewButton</B> vào form để nó dynamically add 
    một button thứ ba tên <B>Button3</B>. Ta muốn button nầy cũng sẽ dùng Sub 
    Button_Click để xử lý Event Click của nó. Vì không thể đánh thêm chữ 
    Button3.Click vào cuối câu Sub Button_Click như trước đây ta đã làm với 
    Button2.Click, nên at runtime ta sẽ dùng 
statement:<BR><BR></FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=green>' Tell system to use Button_Click as Event Handler for the Event Button3.Click</FONT>
AddHandler newButton.Click, AddressOf Me.Button_Click 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>Mã nguồn đầy đủ của <B>Sub BtnAddNewButton_Click</B> được liệt kê dưới 
    đây:<BR><BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> BtnAddNewButton_Click( <FONT color=blue>ByVal</FONT> sender <FONT color=blue>As</FONT> System.Object, <FONT color=blue>ByVal</FONT> e <FONT color=blue>As</FONT> System.EventArgs) <FONT color=blue>Handles</FONT> BtnAddNewButton.Click 
  <FONT color=green>' Declare and instantiate a Button</FONT>
   <FONT color=blue>Dim</FONT> newButton <FONT color=blue>As</FONT> <FONT color=blue>New</FONT> Button() 
  <FONT color=green>' Set it up on the form</FONT>
   <FONT color=blue>With</FONT> newButton 
      .Text = "Button3" <FONT color=green>' Text of this new button</FONT>
      .Location = <FONT color=blue>New</FONT> Point(230, 120) <FONT color=green>' define its location on the form</FONT>
      .Size = <FONT color=blue>New</FONT> Size(88, 40) <FONT color=green>' define its size</FONT>
   <FONT color=blue>End</FONT> <FONT color=blue>With</FONT> 
  <FONT color=green>' Add the new button to the form's collection of controls</FONT>
   Me.Controls.Add(newButton) 
  <FONT color=green>' Tell system to use Button_Click as Event Handler for the Event Button3.Click</FONT>
   AddHandler newButton.Click, AddressOf Me.Button_Click 
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P><FONT size=2>Khi user click BtnAddNewButton, Button3 với Size(88,40) sẽ 
    được tạo ra và đặt ở Location(230,120) trên form. Kế nó chương trình thực 
    hiện hai chuyện quan trọng: Add button mới nầy vào collection of controls 
    của form và đăng ký (register) việc dùng Sub Button_Click làm Event Handler 
    của Event Click của nó.<BR><BR>Làm xong mấy chuyện nầy rồi, bạn chạy chương 
    trình, click AddNewButton để thêm Button3 vào form, kế đó click Button3, bạn 
    sẽ thấy hình dưới đây:<BR><BR>Bạn có thể <A 
    href="http://www.vovisoft.com/dotNET/Bai09/ControlArrays.zip">tải về chương 
    trình ControlArrays nầy</A> tại đây. </FONT></P>
    <BLOCKQUOTE>
      <P><FONT size=2><IMG height=233 src="9_files/NewButton.gif" 
      width=508></FONT></P></BLOCKQUOTE></FONT></FONT><!-- Start of bottom bar for copyright notice etc -->
    <TABLE class=clsNavLinks id=tblFooterLinks cellSpacing=0 cellPadding=0 
    width="100%" border=0>
      <TBODY>
      <TR>
        <TD class=clsRaised width=785 bgColor=#6699cc colSpan=5>
          <P align=center><FONT face=Arial color=#ffffff size=2>Vovisoft © 2000. 
          All rights reserved.</FONT></P></TD></TR>
      <TR>
        <TD width=256>
          <P align=center><FONT face=Arial size=2>&nbsp;&nbsp; Last Updated: <!--webbot 
      bot="Timestamp" S-Type="REGENERATED" S-Format="%d %b %Y" startspan -->12 
          th3 2002<!--webbot 
      bot="Timestamp" endspan i-checksum="13293" --> </FONT></P></TD>
        <TD width=181><FONT face=Arial size=2>&nbsp;</FONT></TD>
        <TD width=258>
          <P align=center><FONT face=Arial size=2><A 
          href="mailto:dixon@vovisoft.com">Webmaster</A></FONT></P></TD></TR></TBODY></TABLE></BLOCKQUOTE></BLOCKQUOTE>
<HR>

<P align=center><FONT face="Times New Roman"><B><FONT color=#ff0000>PcLeHoan 
1996 - 2002</FONT><FONT face=.VnTime size=2><BR></FONT></B></FONT><FONT 
face="Times New Roman" size=2><B>Mirror </B>: <A 
href="http://www.pclehoan.com/andi/ndc.htm">http://www.pclehoan.com/andi/ndc.htm</A><BR><B>Mirror 
</B>: <A 
href="http://www.lehoanpc.net/andi/ndc.htm">http://www.lehoanpc.net/andi/ndc.htm</A></FONT><BR><FONT 
face="Times New Roman" size=2><B>Mirror </B>: <A 
href="http://www.ktlehoan.com/">http://www.ktlehoan.com/</A></FONT></P>
<P align=center><A target=_top 
href="http://member.bcentral.com/cgi-bin/fc/fastcounter-login?2828564"><IMG 
src="9_files/digits.gif" border=0></A> </P></BODY></HTML>
